package com.lanyun.controller;

import com.lanyun.pojo.*;
import com.lanyun.service.ProcurementService;
import com.lanyun.service.ProductService;
import com.lanyun.serviceimpl.ProcurementServiceImpl;
import com.lanyun.serviceimpl.Procurement_etailsServiceImpl;
import com.lanyun.serviceimpl.ProductTypeServiceImpl;
import com.lanyun.serviceimpl.SupplierServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping(value = "/procurement")
public class ProcurementController {

    // 用于接收采购订单页面详情 提供一些数据的传输 以及更改

    @Autowired
    private Procurement_etailsServiceImpl pro_etails;
    @Autowired
    private ProcurementServiceImpl pro;
    @Autowired
    private SupplierServiceImpl sup;
    @Autowired
    private ProductService productService;
    @Autowired
    private ProductTypeServiceImpl typeService;

    // 日志创建
    Logger logger = LoggerFactory.getLogger(getClass());

    @RequestMapping(value = "/showAll",method = RequestMethod.GET)
    public String Show(Model model, HttpSession session){
        // 取出对象
        Admin admin = (Admin) session.getAttribute("admin");
        // 查询数据库中的数据
        List<Procurement> procurements = pro.ShowProcurements();
        // 循环
        for(int i = 0 ; i < procurements.size() ; i ++){
            Double n = 0.0;
            Double jg = 0.0;
            int p = procurements.get(i).getSupplier().getSupplier_id();
            List<Procurement_etails> pe = pro_etails.GetProcurementsByID(procurements.get(i).getPcm_ids());
            for (int j = 0 ; j < pe.size() ; j++){
                Product_supplier ps = pro_etails.GetPrice(p,pe.get(j).getProduct_id());
                Double count = ps.getPurchasingprice() * pe.get(j).getAmount();
                n = count + n;
                BigDecimal b = new BigDecimal(n);
                jg = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
            }
            // 存入集合中
            procurements.get(i).setPricrs(jg);
            System.out.println(n);
       }
        // 将供应商单独提取,并且去重.用于后台页面下拉使用
        List<Supplier> suppliers = new ArrayList<Supplier>();
        // 循环总数据
        for(int i = 0 ; i < procurements.size() ; i ++){
            suppliers.add(procurements.get(i).getSupplier());
        }
        // 设置一个全局变量的集合
        List<Supplier> supplierlist = new ArrayList<Supplier>();
        // 使用contains()方法去重
        for (int i = 0 ; i < suppliers.size() ; i++){
            // 判断listTemp集合中是否包含list中的元素
            if (!supplierlist.contains(suppliers.get(i))) {
                // 将未包含的元素添加进listTemp集合中
                supplierlist.add(suppliers.get(i));
            }
        }
        // 将去重后的集合存入session中
        session.setAttribute("supplierlist",supplierlist);
        // 等到总数据
        Integer ct = pro.Count();
        // 采购订单数据
        model.addAttribute("procurement",procurements);
        // 总数据
        model.addAttribute("count",ct);
        // 去重后 用于下拉框数据
        model.addAttribute("supplierlist",supplierlist);
        // 存入对象
        model.addAttribute("admin",admin);
        return "procurement";
    }

    @RequestMapping(value = "/addpro")
    public String Addpro(){
        return "procurement_add";
    }

    @RequestMapping(value = "/cnm")
    public String Showsome(@RequestParam("supplier") String sup,Model model,HttpSession session){
        // 取出去重的关联商家
        List<Supplier> suppliers = (List<Supplier>) session.getAttribute("supplierlist");
        // 进行判断
        if (sup.equals("all")){
            // 查询数据库中的数据
            List<Procurement> procurements = pro.ShowProcurements();
            // 等到总数据
            Integer ct = procurements.size();
            // 数据存入
            model.addAttribute("supplierlist",suppliers);
            model.addAttribute("procurement",procurements);
            model.addAttribute("count",ct);
        }else {
            // 类型进行装换
            int id = Integer.valueOf(sup);
            // 通过商家的ID 查询出对应的相关数据
            List<Procurement> procurements = pro.GetProcurementByID(id);
            // 等到总数据
            Integer ct = procurements.size();
            model.addAttribute("supplierlist",suppliers);
            model.addAttribute("procurement",procurements);
            model.addAttribute("count",ct);
        }
        return "procurement";
    }

    // 根据下拉框获取供数据 返回数据给订单表
    @RequestMapping("/inquire")
    public String Inquire(@RequestParam("supplier1") String id,@RequestParam("supplier2") String name,Model model,HttpSession session){
        // 取出对象
        Admin admin = (Admin) session.getAttribute("admin");
        // 取出去重后的供应商
        List<Supplier> suppliers = (List<Supplier>) session.getAttribute("supplierlist");
        // 判断如果 状态和订单不匹配
        // 通过供应商ID 获取状态
        if (!("all").equals(id)) {
            List<Procurement> p = pro.Getstatus(id);
            for (int i = 0; i < p.size(); i++) {
                if (!(p.get(i).getPcm_status().equals(name))) {
                    model.addAttribute("admin",admin);
                    model.addAttribute("supplierlist",suppliers);
                    model.addAttribute("tile", "没有该数据");
                    return "procurement";
                }
            }
        }
        // 判断如果 如果id 和 name 全部都是 全部
        if ("all".equals(id) && "all".equals(name)) {
            // 查询所有
            List<Procurement> procurements = pro.selectEnd(null,null);
            for (int i = 0; i<procurements.size();i++){
                System.out.println(procurements.get(i).getPcm_ids()+"    "+procurements.get(i).getPcm_status());
            }
            model.addAttribute("supplierlist",suppliers);
            model.addAttribute("admin",admin);
            model.addAttribute("procurement",procurements);
        }
        if("all".equals(id) && !("all".equals(name))){
            // 则 id 未null
           List<Procurement> procurements = pro.selectEnd(null,name);
           for (int i = 0; i<procurements.size();i++){
               System.out.println(procurements.get(i).getPcm_ids()+"    "+procurements.get(i).getPcm_status());
           }
            model.addAttribute("supplierlist",suppliers);
           model.addAttribute("admin",admin);
           model.addAttribute("procurement",procurements);
        }
        if(!("all".equals(id)) && "all".equals(name)){
            // 则name 未null
            List<Procurement> procurements = pro.selectEnd(id,null);
            model.addAttribute("admin",admin);
            model.addAttribute("procurement",procurements);
        }
        if (!("all".equals(id)) && !("all").equals(name)){
            // 则代表都不未null
            List<Procurement> procurements = pro.selectEnd(id,name);
            model.addAttribute("supplierlist",suppliers);
            model.addAttribute("admin",admin);
            model.addAttribute("procurement",procurements);
        }
        return "procurement";
    }

    // 查询所有供应商的相关信息
    @RequestMapping("/add")
    public String Allsupplier(Model model,HttpSession session){
        // 查询所有出所有商家
        List<Supplier> suppliers = pro.getsuppliers();
        // 将数据储存
        model.addAttribute("sup",suppliers);
        return "procurement_add";
    }

    // 接收增加页面的供应商ID 返回商品
    @RequestMapping("/getproduct")
    @ResponseBody
    public Object Getproduct(@RequestParam("id") String id){
        // 接收到供应商ID 查询出供应商对应的商品
        // System.out.println("======== 供应商"+id);
        // 查询出来的商品是该供应商拥有的商品信息
        List<Product> products = productService.getProductBySupID(Integer.valueOf(id));
        return products;
    }

    // 接收商品ID 返回价格
    @RequestMapping("/price")
    @ResponseBody
    public Object Getprice(@RequestParam("pid") String id,@RequestParam("sid") String sid){
        System.out.println("====商品"+id);
        System.out.println("======供应商" +sid);
        // 第一个是商品ID 第二个则是供应商ID
        // System.out.println("======================== 商品"+id+"======== 供应商ID" + rid);
        // 确保返回的价格 是该供应商的价格
           Product_supplier price = pro_etails.GetPrices(id,sid);
           return price.getPurchasingprice();
    }

    // 接收选择的供应商相关信息展示出相关信息
    @RequestMapping(value = "/showProduct",method = RequestMethod.GET)
    public String ShowProduct(@RequestParam("sup") String sup, Model model, HttpSession session,RedirectAttributes att){
        // 取出session
        List<Supplier> suppliers = (List<Supplier>) session.getAttribute("supp");
        // 根据商家ID查询出商家拥有的商品类型
        // 判断
        if ("all".equals(sup)){
            // 继续返回选择页面 , 并且将供应商返回
            model.addAttribute("sup",suppliers);
            return "procurement_add";
        }else{
            // 根据选取的供应商查询出对应的商品
            List<Product> products = productService.getProductBySupID(Integer.valueOf(sup));
            // 可能存在有些供应商商品卖完了,没有补足.判断如果没有货了,就给用户进行提示
            if (products.size() == 0){
                System.out.println(products.size());
                model.addAttribute("sup",suppliers);
                model.addAttribute("msg","供应商展示无货,请选择其它供应商");
                return "procurement_add";
            }else{
                // 否则将商品给后台展示
                model.addAttribute("product",products);
                return "procurement_add";
            }
        }
    }

    // 获取提交申请单的数据
    @RequestMapping(value ="/applyof",method =RequestMethod.GET)
    @ResponseBody
    public Object Applyof(@RequestParam("lists[]") String[] lists ,@RequestParam("amounts[]") String[] amounts,@RequestParam("gs[]") String[] gs,HttpSession session){
        // lists 是商品的ID
        // amounts 是 数量
        // gs 是供应商的ID
        // 取出登录时的角色 进行判断

        // 调取添加采购单
        // 存入申请采购清单的数据  有申请日期 ,下单员,订单状态,供应商,

        // 创建集合用于去重
        List<String> li = new ArrayList<String>();
        List<String> l = new ArrayList<String>();
        // 循环 取出重复
        for (int z = 0 ; z < gs.length ; z++){
            if(!li.contains(gs[z])){
                // 测试
                li.add(gs[z]);
            }
        }
        //  增加
        //  lists 是商品的ID
        //  amounts 是 数量
        Admin sadmin = (Admin) session.getAttribute("admin");

        int k = 0;
        for (int i = 0 ; i < li.size() ; i ++){
            System.out.println(li.size());
            System.out.println(li.get(i));
            Date date = new Date();
            Supplier su = new Supplier();
            su.setSupplier_id(Integer.valueOf(li.get(i)));
            // 增加采购订单的数据
            Procurement procurement = new Procurement(date,sadmin,su,"未审核");
            pro.AddProcurement(procurement);
            // 每成功一次 都会返回自增的主键
            int id = procurement.getPcm_ids();
            // 再添加采购订单的详情数据 循环
            // 增加采购订单的详情数据
            for(int j = 0 ; j < lists.length ; j++){
                // 判断 供应商如果存在该商品
                Product_supplier price = pro_etails.GetPrices(lists[j],li.get(i));
                if (price != null){
                    k = pro_etails.addprocurement(String.valueOf(id), lists[j], amounts[j], "未入库");
                    k = k + k;
                }else {
                    continue;
                }
            }
        }
        return k;
    }

    // 删除订单列表
    @RequestMapping(value = "/removes")
    @ResponseBody
    public Object Removes(@RequestParam("id") String id){
        // 直接调取删除该该方法
        List<Procurement_etails> procurement_etails = pro_etails.GetProcurementsByID(Integer.valueOf(id));
        // 删除该详情表
        int j = 0 ;
        for (int i = 0 ; i < procurement_etails.size() ; i++){
            j = pro_etails.RemoveProcurement_etailsByID(String.valueOf(procurement_etails.get(i).getPurchase_id()));
            j = j+j;
        }
        if (j == procurement_etails.size()){
            // 表示详情表数据删除成功
            // 可以删除订单表
            int k = pro.RemoveProcurementByID(id);
            if (k == 1){
                return k;
            }
        }
        return 0;
    }

    @RequestMapping(value = "/auditst")
    @ResponseBody
    public Object Auditst(@RequestParam("ast") String ast,@RequestParam("id") String id) throws ParseException {
       // 获取状态 如果是未审核
        System.out.println("=====================");
        if("已审核".equals(ast)){
            // 在修改该订单状态
           int i = pro.upStatus("未审核",id);
           System.out.println(i);
           return i;
       }
        return 0;
    }
}
